﻿using System;
using System.Linq;
using System.Web.Mvc;
using Mvc3App.Domain.Entities;
using System.Data.SqlClient;
using System.Data;
using Mvc3App.Domain.Repository;
using Mvc3App.Repository;

namespace Mvc3App.Controllers
{
    [Authorize]
    public class SocioController : Controller
    {
        //private SocioNHRepository _repository;
        //private SocioMemoryRepository _repository;
        private SocioRepository _repository;

        public SocioController()
        {
            //_repository = new SocioMemoryRepository();
            //_repository = new SocioNHRepository();
            _repository = new SocioRepository();
        }

        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        public JsonResult GetList(string sidx, string sord, int page, int rows, string name, string lastname, string dni)
        {
            // Establecemos la función de ordenación dependiendo del valor del 
            // parámetro "sidx", que es el campo de orden actual
            Func<Socio, IComparable> funcionOrden =
                    sidx == "name" ? s => s.Nombre :
                    sidx == "lastname" ? s => s.Apellido :
                    sidx == "dni" ? s => s.Documento :
            (Func<Socio, IComparable>)(s => s.Id);

            // Establecemos si se trata de orden ascendente o descendente, en
            // función del parámetro "sord", que puede valer "asc" o "desc"
            var ordenAscendente = sord == "asc";
            var row = _repository.GetSliceByFilter(page, rows, funcionOrden, ordenAscendente, name, lastname, dni);
            var totalRegistros = _repository.Count();

            int totalPages = (int)Math.Ceiling((decimal)totalRegistros / (decimal)rows);
            int cantElemPagina = rows;
            var data = new
            {
                total = totalPages,
                page = page,
                records = totalRegistros,
                rows = (
                           from m in row
                           select new
                           {
                               Id = m.Id,
                               Nombre = m.Nombre,
                               Apellido = m.Apellido,
                               Documento = m.Documento,
                               FechaIngreso = m.FechaIngreso.HasValue ? m.FechaIngreso.Value.ToShortDateString() : string.Empty,
                               Domicilio = m.Domicilio,
                               Localidad = m.Localidad,
                               Telefono = m.Telefono
                           }).ToArray()
            };

            return Json(data, JsonRequestBehavior.AllowGet);
        }

        public JsonResult GetListStore(string sidx, string sord, int page, int rows, string name, string lastname, string dni)
        {
            SqlConnection con = new SqlConnection("Data Source=192.168.1.10; Initial Catalog=AppWebDemo;user=sa;password=luis");
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "ConsultarSocio";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("dni", dni));
            cmd.Parameters.Add(new SqlParameter("apellido", lastname));
            cmd.Parameters.Add(new SqlParameter("nombre", name));

            DataTable oTable = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);

            da.Fill(oTable);

            var totalRegistros = oTable.Rows.Count;
            int totalPages = (int)Math.Ceiling((decimal)totalRegistros / (decimal)rows);
            int cantElemPagina = rows;

            var data = new
            {
                total = totalPages,
                page = page,
                records = totalRegistros,
                rows = (
                           from m in oTable.AsEnumerable()
                           select new
                           {
                               Id = m.ItemArray[0],
                               Nombre = m.ItemArray[3],
                               Apellido = m.ItemArray[2],
                               Documento = m.ItemArray[1],
                               FechaIngreso = m.ItemArray[7],
                               Domicilio = m.ItemArray[15],
                               Localidad = m.ItemArray[16],
                               Telefono = m.ItemArray[19]
                           }).Skip((page - 1) * cantElemPagina).Take(cantElemPagina)
            };



            return Json(data, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Create()
        {
            var model = new Socio();
            return View(model);
        }

        [HttpPost]
        public ActionResult Create(Socio model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            _repository.Add(model);
            return RedirectToAction("Index");
        }

        public ViewResult Details(int id)
        {
            var model = _repository.GetOne(id);
            return View(model);
        }

        public ActionResult Edit(int id)
        {
            var model = _repository.GetOne(id);
            return View(model);
        }

        [HttpPost]
        public ActionResult Edit(Socio model)
        {
            if (ModelState.IsValid)
            {
                _repository.Update(model);
                return RedirectToAction("Index");
            }
            else
            {
                return View(model);
            }
        }

        public ActionResult Delete(int id)
        {
            var model = _repository.GetOne(id);
            return View(model);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            var model = _repository.GetOne(id);
            _repository.Delete(model);
            return RedirectToAction("Index");
        }
    }
}
